package com.poi.demopoi.exception.rtest;

import lombok.Getter;
import lombok.ToString;

/** https://blog.csdn.net/qq_34347620/article/details/102239179 ： Spring Boot 无侵入式 实现API接口统一JSON格式返回
 * 描述：正规军的 API接口统一JSON格式
 * 拓展：
 *      https://www.jianshu.com/p/90bac4eda34a ： 如何优雅设计 API 接口，实现统一格式返回？
 *      https://www.toutiao.com/i6694404645827117572/ 如何设计API接口，实现统一格式返回？
 * @param <T>
 */
@Getter
@ToString
public class R3<T> {
    /** 业务错误码 */
    private Integer code;
    /** 信息描述 */
    private String message;
    /** 返回参数 */
    private T data;

    private R3(ResultStatus resultStatus, T data) {
        this.code = resultStatus.getCode();
        this.message = resultStatus.getMessage();
        this.data = data;
    }

    /** 业务成功返回业务代码和描述信息 */
    public static R3<Void> ok() {
        return new R3<Void>(ResultStatus.SUCCESS, null);
    }

    /** 业务成功返回业务代码,描述和返回的参数 */
    public static <T> R3<T> ok(T data) {
        return new R3<T>(ResultStatus.SUCCESS, data);
    }

    /** 业务成功返回业务代码,描述和返回的参数 */
    public static <T> R3<T> ok(ResultStatus resultStatus, T data) {
        if (resultStatus == null) {
            return ok(data);
        }
        return new R3<T>(resultStatus, data);
    }

    /** 业务异常返回业务代码和描述信息 */
    public static <T> R3<T> failure() {
        return new R3<T>(ResultStatus.INTERNAL_SERVER_ERROR, null);
    }

    /** 业务异常返回业务代码,描述和返回的参数 */
    public static <T> R3<T> failure(ResultStatus resultStatus) {
        return failure(resultStatus, null);
    }

    /** 业务异常返回业务代码,描述和返回的参数 */
    public static <T> R3<T> failure(ResultStatus resultStatus, T data) {
        if (resultStatus == null) {
            return new R3<T>(ResultStatus.INTERNAL_SERVER_ERROR, null);
        }
        return new R3<T>(resultStatus, data);
    }
}
